CloudFormationでクロスアカウントアクセスロールを作成してみた
CloudFormationでクロスアカウントアクセスロールを作成する機会があったのでブログにまとめておきます。
クロスアカウントアクセスロールとは
クロスアカウントアクセスロールとはAWSアカウントAにあるIAMロールの権限をAWSアカウントBのIAMユーザが利用してアカウントAのリソースを操作するためのものになります。
メリットとしてはアカウントBにログインした状態からログアウトしてアカウントAにアクセスするといったことが不要になります。
IAM チュートリアル: AWS アカウント間の IAM ロールを使用したアクセスの委任
マネジメントコンソールから作成する場合はIAMロールを作成する画面の「信頼されたエンティティタイプ」を選択して信頼するAWSアカウントIDを入力すると作成できます。
本題のCloudFormationテンプレート
今回作成したCloudFormationテンプレートは以下になります。
AWSTemplateFormatVersion: "2010-09-09" Description: Cross Acount Access Role Parameters: # ------------------------------------------------------------# # Parameters # ------------------------------------------------------------# IamUserName: Type: String Description: IAM User Name AWSAccountId: Type: Number Description: AWS AccountId IamRoleName: Type: String Description: IAM Role Name Resources: # ------------------------------------------------------------# # IAM # ------------------------------------------------------------# IamRole: Type: AWS::IAM::Role Properties: AssumeRolePolicyDocument: Version: "2012-10-17" Statement: - Effect: Allow Principal: AWS: - !Join - '' - - 'arn:aws:iam::' - !Ref AWSAccountId - :user/ - !Ref IamUserName Action: - sts:AssumeRole Condition: Bool: aws:MultiFactorAuthPresent: true ManagedPolicyArns: - arn:aws:iam::aws:policy/PowerUserAccess RoleName: !Ref IamRoleName
テンプレート説明
以下の部分では作成するIAMロールを使用するIAMユーザ、AWSアカウントID、作成するIAMロール名をパラメータとして設定できるようにしています
Parameters: # ------------------------------------------------------------# # Parameters # ------------------------------------------------------------# IamUserName: Type: String Description: IAM User Name AWSAccountId: Type: Number Description: AWS AccountId IamRoleName: Type: String Description: IAM Role Name
以下の部分では実際にIAMロールを作成しています。
AssumeRolePolicyDocumentでIAMロールを引き受けられる信頼されたAWSアカウントのIAMユーザを指定しています。
ManagedPolicyArnsでAWSマネージドポリシーを設定しています。今回はPowerUserAccessを設定しました。
Resources: # ------------------------------------------------------------# # IAM # ------------------------------------------------------------# IamRole: Type: AWS::IAM::Role Properties: AssumeRolePolicyDocument: Version: "2012-10-17" Statement: - Effect: Allow Principal: AWS: - !Join - '' - - 'arn:aws:iam::' - !Ref AWSAccountId - :user/ - !Ref IamUserName Action: - sts:AssumeRole Condition: Bool: aws:MultiFactorAuthPresent: true ManagedPolicyArns: - arn:aws:iam::aws:policy/PowerUserAccess RoleName: !Ref IamRoleName
実際に作成してみる
今回はマネジメントコンソール上からではなくAWS CLIでCloudFormationスタックを作成してみました。
AWS CLIのインストールは以下のブログを参考にしてください。
ローカルのWindowsPCにAWS CLIをインストールしてみた
Windows10+WSL2環境のLinuxディストリビューションにAWS CLIをインストールしてみた
PowerShell上で以下のコマンドを実行します。
※IAMロールを作成するAWSアカウントはIAMユーザのあるAWSアカウントとは別のところになります。
aws cloudformation create-stack --stack-name CloudFormationスタック名 --template-body file://CloudFormationテンプレートファイル名 --parameters ParameterKey=IamUserName,ParameterValue=IAMユーザ名 ParameterKey=AWSAccountId,ParameterValue=信頼するAWSアカウントID ParameterKey=IamRoleName,ParameterValue=IAMロール名 --capabilities CAPABILITY_NAMED_IAM
IAM関連のリソースを作成するときはオプションで「--capabilities CAPABILITY_NAMED_IAM」を指定しないと以下のエラーが出力されます。
An error occurred (InsufficientCapabilitiesException) when calling the CreateStack operation: Requires capabilities : [CAPABILITY_NAMED_IAM]
create-stack
しばらく待つと作成が完了するのでアクセスしてみます。
IAMユーザのあるアカウントAのマネジメントコンソールにアクセスして画面右上にあるIAMユーザ名をクリックします。
クリックすると以下のものが表示されるのでロールの切り替えをクリックします。
クリックすると以下の画面に移動するので「アカウント」にIAMロールのあるAWSアカウントID、「ロール」に作成したIAMロール名、「表示名」に任意の表示名を入力してロールの切り替えをクリックするとAWSアカウントが切り替わります。
さいごに
クロスアカウントアクセスロールは便利な反面どの環境にアクセスしているのかわかりにくくなることがあります。
そのためIAMロールを作成する際は今回のようなPowerUserではなく、しっかりと必要な権限だけに絞ったものを作成するようにする必要があると思いました。